home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / pibcat.arc / PIBCATM.PAS < prev    next >
Pascal/Delphi Source File  |  1989-03-31  |  10KB  |  198 lines

  1. (*----------------------------------------------------------------------*)
  2. (*   Display_MD_Contents --- Display contents of library (.MD) file     *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Display_MD_Contents( MDFileName : AnyStr );
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*    Procedure: Display_MD_Contents                                    *)
  10. (*                                                                      *)
  11. (*    Purpose:   Displays contents of a library file (.MD file)         *)
  12. (*                                                                      *)
  13. (*    Calling sequence:                                                 *)
  14. (*                                                                      *)
  15. (*       Display_MD_Contents( MDFileName : AnyStr );                    *)
  16. (*                                                                      *)
  17. (*          MDFileName --- name of .MD file whose contents              *)
  18. (*                         are to be listed.                            *)
  19. (*                                                                      *)
  20. (*    Calls:                                                            *)
  21. (*                                                                      *)
  22. (*       Aside from internal subroutines, these routines are required:  *)
  23. (*                                                                      *)
  24. (*          Dir_Convert_Date_And_Time                                   *)
  25. (*                            --- convert DOS packed date/time to string*)
  26. (*          Open_File         --- open a file                           *)
  27. (*          Close_File        --- close a file                          *)
  28. (*          Entry_Matches     --- Perform wildcard match                *)
  29. (*          Display_Page_Titles                                         *)
  30. (*                            --- Display titles at top of page         *)
  31. (*          DUPL              --- Duplicate a character into a string   *)
  32. (*                                                                      *)
  33. (*----------------------------------------------------------------------*)
  34.  
  35. TYPE
  36.    Array4 = ARRAY[1..4] OF CHAR;
  37.    
  38. (* STRUCTURED *) CONST
  39.    ValidSig : Array4 = 'MDmd'      (* Signature to verify mdcd file     *);
  40.  
  41. (*----------------------------------------------------------------------*)
  42. (*                  Map of MD file entry header                         *)
  43. (*----------------------------------------------------------------------*)
  44.  
  45. TYPE
  46.    MD_Entry_Type = RECORD             (* Header for each compressed file *)
  47.  
  48.                       Signature    : Array4              (* file/header signature (MDmd)      *);
  49.                       ReleaseLevel : BYTE                (* compress version                  *);
  50.                       HeaderType   : BYTE                (* header type. only type 1 for now  *);
  51.                       HeaderSize   : WORD                (* size of this header in bytes      *);
  52.                       UserInfo     : WORD                (* any user info desired             *);
  53.                       Reserved1    : WORD                (* future use and upward compatablty *);
  54.                       Reserved2    : LONGINT             (* future use and upward compatablty *);
  55.                       Reserved3    : ARRAY[1..8] OF BYTE (* future use and upward compatablty *);
  56.                       CompressType : BYTE                (* type of compression               *);
  57.                       OrigFileSize : LONGINT             (* original file size in bytes       *);
  58.                       CompFileSize : LONGINT             (* compressed file size in bytes     *);
  59.                       FileAttr     : WORD                (* original file attribute           *);
  60.                       FileDate     : LONGINT             (* original file date/time           *);
  61.                       FileCRC      : WORD                (* file crc                          *);
  62.                       FileName     : STRING[12]          (* file name                         *);
  63.                       PathName     : DirStr              (* original drive\path               *);
  64.  
  65.                   END;
  66.  
  67. VAR
  68.    MDFile        : FILE                 (* MD file to be read             *);
  69.    MD_Entry      : MD_Entry_Type        (* Header for one file in MD file *);
  70.    MD_Pos        : LONGINT              (* Current byte offset in MD file *);
  71.    Bytes_Read    : INTEGER              (* # bytes read from MD file      *);
  72.    Ierr          : INTEGER              (* Error flag                     *);
  73.    Long_Name     : AnyStr               (* Long file name                 *);
  74.  
  75. (*----------------------------------------------------------------------*)
  76. (*        Get_Next_MD_Entry --- Get next header entry in MD file        *)
  77. (*----------------------------------------------------------------------*)
  78.  
  79. FUNCTION Get_Next_MD_Entry( VAR MDEntry : MD_Entry_Type;
  80.                             VAR Error   : INTEGER ) : BOOLEAN;
  81.  
  82. (*----------------------------------------------------------------------*)
  83. (*                                                                      *)
  84. (*    Function:  Get_Next_MD_Entry                                      *)
  85. (*                                                                      *)
  86. (*    Purpose:   Gets header information for next file in MD file       *)
  87. (*                                                                      *)
  88. (*    Calling sequence:                                                 *)
  89. (*                                                                      *)
  90. (*       OK := Get_Next_MD_Entry( VAR MDEntry : MD_Entry_Type;          *)
  91. (*                                VAR Error   : INTEGER );              *)
  92. (*                                                                      *)
  93. (*          MDEntry --- Header data for next file in MD file            *)
  94. (*          Error   --- Error flag                                      *)
  95. (*          OK      --- TRUE if header successfully found, else FALSE   *)
  96. (*                                                                      *)
  97. (*----------------------------------------------------------------------*)
  98.  
  99. BEGIN (* Get_Next_MD_Entry *)
  100.                                    (* Assume no error to start *)
  101.    Error := 0;
  102.                                    (* Except first time, move to     *)
  103.                                    (* next supposed header record in *)
  104.                                    (* MD file.                       *)
  105.  
  106.    IF ( MD_Pos <> 0 ) THEN
  107.       Seek( MDFile, MD_Pos );
  108.  
  109.                                    (* Read in the file header entry. *)
  110.  
  111.    BlockRead( MDFile, MDEntry, SizeOf( MD_Entry ), Bytes_Read );
  112.    Error := 0;
  113.                                    (* If we didn't read enough, assume     *)
  114.                                    (* it's the end of the file.            *)
  115.  
  116.    IF ( Bytes_Read <  SizeOf( MD_Entry ) ) THEN
  117.       Error := End_Of_File
  118.                                    (* Check signature.  If wrong, then    *)
  119.                                    (* file is bad or not an MD file at    *)
  120.                                    (* all.                                *)
  121.  
  122.    ELSE IF ( MDEntry.Signature <> ValidSig ) THEN
  123.       Error := Format_Error
  124.    ELSE                            (* Header looks ok -- we got    *)
  125.                                    (* the entry data.  Position to *)
  126.                                    (* next header.                 *)
  127.       WITH MDEntry DO
  128.          MD_Pos := MD_Pos + HeaderSize + CompFileSize;
  129.  
  130.                                     (* Report success/failure to calling *)
  131.                                     (* routine.                          *)
  132.  
  133.    Get_Next_MD_Entry := ( Error = 0 );
  134.  
  135. END   (* Get_Next_MD_Entry *);
  136.  
  137. (*----------------------------------------------------------------------*)
  138. (*         Display_MD_Entry --- Display MD file header entry            *)
  139. (*----------------------------------------------------------------------*)
  140.  
  141. PROCEDURE Display_MD_Entry( MD_Entry : MD_Entry_Type );
  142.  
  143. VAR
  144.    FName      : AnyStr;
  145.  
  146. BEGIN (* Display_MD_Entry *)
  147.  
  148.    WITH MD_Entry DO
  149.       BEGIN
  150.                                    (* Pick up file name              *)
  151.          FName := FileName;
  152.                                    (* See if this file matches the   *)
  153.                                    (* entry spec wildcard.  Exit if  *)
  154.                                    (* not.                           *)
  155.  
  156.          IF Use_Entry_Spec THEN
  157.             IF ( NOT Entry_Matches( FName ) ) THEN
  158.                EXIT;
  159.                                    (* See if we're to write out *)
  160.                                    (* long file names.  If so,  *)
  161.                                    (* get subdirectory path     *)
  162.                                    (* followed by file name.    *)
  163.  
  164.          IF Show_Long_File_Names THEN
  165.             Long_Name := PathName + FileName
  166.          ELSE
  167.             Long_Name := '';
  168.                                    (* Display info for this entry *)
  169.  
  170.          Display_One_Entry( FName, OrigFileSize, FileDate, MDFileName,
  171.                             Current_Subdirectory, Long_Name );
  172.  
  173.       END;
  174.  
  175. END (* Display_MD_Entry *);
  176.  
  177. (*----------------------------------------------------------------------*)
  178.  
  179. BEGIN (* Display_MD_Contents *)
  180.                                    (* Open MD file and initialize display *)
  181.  
  182.    IF Start_Contents_Listing( ' MD file: ',
  183.                               Current_Subdirectory + MDFileName, MDFile,
  184.                               MD_Pos, Ierr ) THEN
  185.       BEGIN
  186.                                    (* Loop over entries in MD file *)
  187.  
  188.          WHILE( Get_Next_MD_Entry( MD_Entry , Ierr ) ) DO
  189.             Display_MD_Entry( MD_Entry );
  190.  
  191.                                    (* Close MD file *)
  192.  
  193.          End_Contents_Listing( MDFile , Ierr );
  194.  
  195.       END;
  196.  
  197. END   (* Display_MD_Contents *);
  198.